package com.zy.cat.common.utils;

import java.time.Instant;
import java.time.LocalDate;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import java.util.UUID;

import org.springframework.util.DigestUtils;

import com.alibaba.fastjson.JSON;

/**  
 * @Description: 九趣猫数据加密交互
 * @author xiake
 * @date 2019-12-17 04:03:09 
*/
public class CatSignEncryptionUtil {

	//key二次加密所需的盐
	private final static String KEY_SALT= "acde#*.@TJ";
	
	/**
	 * 加密单字符串
	 * @author xiake
	 * @date 2019-12-10 10:34:55
	 * @param data 加密内容
	 * @param key 原始key
	 * @return
	 */
	public static String getCiphertext(String data,String key) {
		key=getKey(key);
		String encrypt = DESUtil.encrypt(data, key);
		return AesEncryptUtils.encrypt(encrypt);
	}
	
	/**
	 * 加密map对象
	 * @author xiake
	 * @date 2019-12-10 10:34:55
	 * @param data 加密内容
	 * @param key 原始key
	 * @return
	 */
	public static String getCiphertext(Map<String,String> data,String key) {
		final String key2=getKey(key);
		//将Map中的值进行加密
		data.forEach((k,value)->{
			value=DESUtil.encrypt(value, key2);
			data.put(k, value);
		});
		return AesEncryptUtils.encrypt(JSON.toJSONString(data));
	}

	/**
	 * 获取key,将原始key进行二次加密处理
	 * @author xiake
	 * @date 2019-12-10 10:34:55
	 * @param key 二次加密后的key
	 */
	private static String getKey(String key) {
		//获取二次加密的组成元素
		Instant instant = Instant.now();
		long now=Date.from(instant).getTime();
		String stringNow = String.valueOf(now).substring(0, 6);
		StringBuffer buffer=new StringBuffer();
		for (int i = 0; i < stringNow.length(); i++) {
			buffer.append(KEY_SALT.charAt(Integer.valueOf((String) stringNow.subSequence(i, i+1))));
		}
		//组装key后进行MD5加密
		key=key+buffer.toString();
		return DigestUtils.md5DigestAsHex(key.getBytes());
	}
	
	/**
	 * 解密
	 * @author xiake
	 * @date 2019-12-10 10:34:55
	 * @param data 需要解密的数据
	 * @param key
	 * @return
	 */
	public static String getPlaintext(String data,String key) {
		key=getKey(key);
		String decrypt = AesEncryptUtils.decrypt(data);
		return DESUtil.decrypt(decrypt, key);
	}
	
	/**
	 * 解密，数据类型为map是的加密对象
	 * @author xiake
	 * @date 2019-12-10 10:34:55
	 * @param data 需要解密的数据
	 * @param key
	 * @return
	 */
	public static Map<String, String> getPlaintextToMap(String data,String key) {
		String key2=getKey(key);
		String decrypt = AesEncryptUtils.decrypt(data);
		Map<String, Object> jsonObject = JSON.parseObject(decrypt);
		Map<String,String> resultMap=new HashMap<>();
		//将Map中的值进行解密
		jsonObject.forEach((k,value)->{
			value=DESUtil.decrypt((String)value, key2);
			resultMap.put(k, (String)value);
		});
		return resultMap;
	}
	
	/**
	 * 自动生成key
	 * @author xiake
	 * @date 2019-12-10 10:34:55
	 * @return
	 */
	public static String generateKey() {
		/**
		 * 生成规则 由时间戳加随机ID生成唯一key
		 */
		String key=LocalDate.now().toString()+UUID.randomUUID();
		return DigestUtils.md5DigestAsHex(key.getBytes());
	}
	
	
	
	public static void main(String[] args) {
		//需要加密的文本
		String text="testc146995ce70eb12e";
//		//原始key
		String key="123456";
//		//加密
		String ciphertext = getCiphertext(text,key);
		System.out.println("加密后的密文："+ciphertext);
//		//解密
		String plaintext = getPlaintext(ciphertext, key);
		System.out.println("解密后的明文："+plaintext);
//		String generateKey = generateKey();
//		System.out.println(generateKey);
	}
	
}
